package com.example.yx.demo13;

import java.lang.reflect.Method;

public class A13 {
    //需要被代理类和目标类实现的接口
    interface Foo{
        void foo() throws NoSuchMethodException;
        void bar() throws NoSuchMethodException;

        //存在返回值的方法
        int bar1();
    }

    //目标类
    static class Target implements Foo{
        public void foo() {
            System.out.println("target foo");
        }

        @Override
        public void bar() {
            System.out.println("target bar");
        }

        @Override
        public int bar1() {
            System.out.println("target bar1");
            return 100;
        }
    }

    //为了使代理类能为接口的不同方法进行不同的代理，设置一个接口用于识别需要代理的接口的方法，参数是方法 和 方法需要的参数，对于代理对象这个参数，只是以防备用
    interface InvocationHandler {
        //考虑到方法可能有返回值，所以需要Object，
        Object invoke(Object proxy,Method method,Object[] args) throws Throwable;
    }

    public static void main(String[] args) throws NoSuchMethodException {
        Foo proxy = new $Proxy0(new InvocationHandler() {
            @Override
            public Object invoke(Object proxy,Method method, Object[] args) throws Throwable {
                //1.功能增强
                System.out.println("before..");
                //2.调用目标
//                new Target().foo();
                //3.反射实现该方法

                return method.invoke(new Target(),args);
            }
        });
        proxy.foo();
        proxy.bar();
    }
}
